
/*
 * 版权声明 (c) 2025 XXX科技有限公司
 *
 * 本软件及其相关文档文件受版权保护。未经版权所有者明确书面许可，任何单位或个人不得
 * 以任何形式复制、传播、修改、出售、出租、反向工程、反编译或利用本软件的任何部分。
 *
 * 对于任何违反本声明的行为，版权所有者保留追究法律责任的权利。
 */

#ifndef _SOCKET_H
#define _SOCKET_H

/***************************************************************************
 * 跨平台网络编程头文件整合版
 * 支持Windows/Linux平台
 * 编译说明：
 *   Windows: 需链接Ws2_32.lib
 *   Linux:   gcc需加 -std=gnu11 参数
 ***************************************************************************/

//=============================== 公共定义部分 ===============================//
#include <stdint.h> // 固定宽度整数类型
#include <stdio.h>  // 标准输入输出
#include <stdlib.h> // 标准库函数
#include <string.h> // 字符串操作

//=============================== 平台差异定义 ===============================//
#ifdef _WIN32 || _WIN64                       // Windows平台
#include <windows.h>                          // 提供Windows API功能
#include <winsock2.h>                         // 提供套接字功能
#include <ws2tcpip.h>                         // 提供TCP/IP协议相关功能
#pragma comment(lib, "Ws2_32.lib")            // 链接 Winsock 库
#define close(sockfd) closesocket(sockfd)     // 将close替换为closesocket
#define bzero(ptr, size) memset(ptr, 0, size) // 兼容bzero函数
#define SOCKET_ERROR (-1)                     // 定义SOCKET_ERROR
#define INVALID_SOCKET (~0)                   // 定义INVALID_SOCKET
#define GET_LAST_ERROR() WSAGetLastError()    // 获取最后一个错误代码
typedef unsigned long in_addr_t;              // 兼容Linux类型定义
static inline void net_setup() {              // 安装网络组件
	WSADATA wsaData;
	WSAStartup(MAKEWORD(2, 2), &wsaData);
}
static inline void net_cleanup() { WSACleanup(); } // 卸载网络组件
#else                                              // Linux/Unix平台
#include <arpa/inet.h>                             // 提供地址转换功能
#include <errno.h>                                 // 提供错误号定义
#include <fcntl.h>                                 // 提供文件控制选项
#include <netinet/in.h>                            // 提供IPv4和IPv6地址结构
#include <sys/socket.h>                            // 提供套接字功能
#include <unistd.h>                                // 提供POSIX操作系统API功能
#define INVALID_SOCKET (-1)                        // 定义INVALID_SOCKET
#define SOCKET_ERROR (-1)                          // 定义SOCKET_ERROR
#define GET_LAST_ERROR() errno                     // 获取最后一个错误代码
typedef int SOCKET;                 // 定义SOCKET类型为int
static inline void net_setup() {}   // 安装网络组件
static inline void net_cleanup() {} // 卸载网络组件
#endif

//=============================== 网络参数配置 ===============================//
#define MAX_CONN 10      // 监听队列长度
#define BUFFER_SIZE 1024 // 数据缓冲区

//=============================== 常见网络错误 ===============================//
/* ---------------- 基础状态码 --------------- */
#define OK 0         // 成功
#define ERROR -1     // 通用错误
#define ERR_PARAM -2 // 参数错误
#define ERR_INIT -3  // 未初始化
#define ERR_BUSY -4  // 资源忙

/* ---------------- 初始化/清理 --------------- */
#define ERR_WINSOCK_INIT -101 // Winsock初始化失败
#define ERR_THREAD_INIT -102  // 线程初始化失败
#define ERR_CLEANUP -103      // 清理失败

/* ----------------套接字操作 ---------------- */
#define ERR_SOCK_CREATE -201 // 创建失败
#define ERR_SOCK_BIND -202   // 绑定失败
#define ERR_SOCK_LISTEN -203 // 监听失败
#define ERR_SOCK_ACCEPT -204 // 接收连接失败
#define ERR_SOCK_TYPE -205   // 类型不支持
#define ERR_SOCK_CLOSE -206  // 关闭失败

/* ----------------地址端口 ---------------- */
#define ERR_ADDR_FORMAT -301  // 地址格式错误
#define ERR_PORT_RANGE -302   // 端口越界
#define ERR_DNS_FAIL -303     // DNS解析失败
#define ERR_ADDR_INUSE -304   // 地址已被占用
#define ERR_HOST_UNREACH -305 // 主机不可达

/* ----------------连接错误 ---------------- */
#define ERR_CONN_TIMEOUT -401 // 连接超时
#define ERR_CONN_REFUSED -402 // 连接被拒绝
#define ERR_CONN_RESET -403   // 连接被重置
#define ERR_CONN_ABORT -404   // 连接中止
#define ERR_CONN_PROTO -405   // 协议不匹配

/* ----------------数据传输 ---------------- */
#define ERR_SEND_BUF_FULL -501 // 发送缓冲区满
#define ERR_SEND_FAIL -502     // 发送失败
#define ERR_RECV_TIMEOUT -503  // 接收超时
#define ERR_CHECKSUM -504      // 校验和错误
#define ERR_MSG_TOOBIG -505    // 数据过大

/* ----------------协议错误 ---------------- */
#define ERR_HTTP_404 -601  // 资源未找到
#define ERR_SSL_INIT -602  // SSL初始化失败
#define ERR_HANDSHAKE -603 // SSL握手失败
#define ERR_PROTO_VER -604 // 协议版本不支持
#define ERR_PROTO_HDR -605 // 协议头错误

/* ----------------系统资源 ---------------- */
#define ERR_MEMORY -701   // 内存不足
#define ERR_FD_LIMIT -702 // 文件描述符耗尽
#define ERR_THREAD -703   // 线程创建失败
#define ERR_CPU_LOAD -704 // CPU过载

/* ----------------安全相关 ---------------- */
#define ERR_CERT_EXPIRE -801 // 证书过期
#define ERR_CERT_VERIFY -802 // 证书验证失败
#define ERR_AUTH_REQ -803    // 需要认证
#define ERR_CRYPTO -804      // 加密失败

/* ----------------其他错误 ---------------- */
#define ERR_UNKNOWN -999 // 未知错误
//==========================================================================//
#endif // _SOCKET_H


#ifdef __MAIN__
int main() {
	net_setup(); // Windows必须初始化

	SOCKET sockfd = socket(AF_INET, SOCK_DGRAM, 0);
	if (sockfd == INVALID_SOCKET) {
		printf("Create socket failed! Error: %d\n", GET_LAST_ERROR());
		return -1;
	}

	struct sockaddr_in addr = {0};
	addr.sin_family         = AF_INET;
	addr.sin_port           = htons(8080);
	addr.sin_addr.s_addr    = INADDR_ANY;

	if (::bind(sockfd, (struct sockaddr *) &addr, sizeof(addr)) == SOCKET_ERROR) {
		printf("Bind failed! Error: %d\n", GET_LAST_ERROR());
		close(sockfd);
		return -1;
	}

	close(sockfd);
	net_cleanup(); // Windows必须清理
	return 0;
}
#endif // _MAIN
